package jus.aor.printing;

import java.net.*;
import java.util.logging.Logger;
import java.io.*;

import jus.aor.printing.Level;
import jus.aor.printing.Notification;

import static jus.aor.printing.Notification.*;
/**
 * Représentation du Client du serveur d'impression.
 * @author Morat
 */
public class Client {
	/** 1 second timeout for waiting replies */
	protected static final int TIMEOUT = 1000;
	/** la machine supportant le serveur d'impression */
	private String host = "localhost";
	/** le port d'installation du serveur d'impression */
	private int port=3000;
	/** le listener est-il vivant */
	private boolean alive=true;
	/** le logger du client */
	private Logger log = Logger.getLogger("Jus.Aor.Printing.Client","jus.aor.printing.Client");
	/** l'interfaçage avec la console du client */
	private ClientGUI GUI;
        private JobKey key;
	/**
	 * construction d'un client
	 */
	public Client() {
		GUI = new ClientGUI(this);
		log.setLevel(Level.INFO_2);
	}
	/**
	 * @param key la cle du du job
	 * @throws IOException 
	 */
	private void jobTerminated(JobKey key) throws IOException{
		GUI.removePrintList(key);
	}
	/**
	 * Fixe le remote host
	 * @param host le remote host supportant le serveur d'impression
	 */
	public void setHost(String host) { this.host=host;}
	/**
	 * Fixe le port du serveur d'impression
	 * @param port le port supportant le serveur d'impression
	 */
	public void setPort(int port) { this.port=port;}
	/**
	 * protocole de print d'un fichier
	 * @param f le fichier à imprimer
	 */
	private void onePrint(File f){
		Socket server = null;
		try(InputStream fis = new FileInputStream(f)){
			// todo
			// creer un socket
                        server=new Socket(host, port);
                        // envoyer la requete et jobkey au serveur
                        TCP.writeProtocole(server, QUERY_PRINT);
                        
                        Notification ret = null;
                        
                        // recevoir la reponse
                        ret=TCP.readProtocole(server);
                        
			if(ret == REPLY_PRINT_OK) {
				log.log(Level.INFO_3,"Client.QueryPrint.Done",key);
				GUI.addPrintList(key);
                                // envoyer le fichier a imprimer
                                TCP.writeData(server, fis);
                        }else {
                                log.log(Level.WARNING,"Client.QueryPrint.Failed");
                        }
		}catch(NumberFormatException e){
			log.log(Level.SEVERE,"Client.QueryPrint.Port.Error",e.getMessage());
		}catch(UnknownHostException e){
			log.log(Level.SEVERE,"Client.QueryPrint.Remote.Error",e.getMessage());
		}catch(IOException e){
			log.log(Level.SEVERE,"Client.QueryPrint.IO.Error",e.getMessage()); 
		}
	}
        // ??? to be modified
        public void queryPrint(File f){
                onePrint(f);
        }
        // ??? to be modified
        public boolean queryStatus(){
                return false;
        }
	/**
	 * @param args
	 */
	public static void main(String args[]) {
		new Client();
	}
}
